//package com.example.chatweb.service.impl;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.example.chatweb.entity.PdfExtract;
//import com.example.chatweb.entity.PdfimageExtract;
//import com.example.chatweb.mapper.PdfExtractMapper;
//import com.example.chatweb.mapper.PdfimageExtractMapper;
//import com.example.chatweb.service.FileService;
//import com.example.chatweb.service.PdfExtractService;
//import com.example.chatweb.utils.HttpUtil;
//import com.example.chatweb.utils.MyExceptionHandler;
//import java.io.BufferedOutputStream;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.net.URL;
//import java.net.URLConnection;
//import java.nio.charset.Charset;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipFile;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.mock.web.MockMultipartFile;
//import org.springframework.stereotype.Service;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.multipart.MultipartFile;
//
///**
// * @author Black Curry
// * @description 针对表【pdf_extract】的数据库操作Service实现
// * @createDate 2024-04-06 10:23:36
// */
//@Service
//@Slf4j
//public class PdfExtractServiceImpl extends ServiceImpl<PdfExtractMapper, PdfExtract>
// implements PdfExtractService {
//
//	@Autowired
//	private RestTemplate restTemplate;
//	@Autowired
//	private HttpUtil httpUtil;
//	@Autowired
//	private PdfimageExtractMapper pdfimageExtractMapper;
//	@Autowired
//	private FileService fileService;
//
//	/**
//	 * 描述:finish字段如果为false表示没有完成(这时候也不会有其他字段)
//	 */
//
//	@Override
//	public Map<String, Object> allExtract(Long pdfUuid, String pdfUrl) throws IOException {
//		// TODO: 暂时只判断图像
//		// 检查 pdfUuid 是否存在，不存在则创建，然后直接解析，不然查询
//		if (!isExistPdfUuid(pdfUuid)) {
//			//	直接创建一个
//			PdfExtract pdfExtract = new PdfExtract();
//			pdfExtract.setPdfUuid(pdfUuid);
//			pdfExtract.setPdfUrl(pdfUrl);
//			this.save(pdfExtract);
//			//异步调用解析服务
//			imageExtract(pdfUuid, pdfUrl);
//		}
//		// 判断一个当前处于哪种解析状态
//		PdfExtract pdfExtract = this.getById(pdfUuid); //存储pdfuuid和pdfurl映射的表
//		//通过pdfuuid查询所有符合条件的行
//		QueryWrapper<PdfimageExtract> queryWrapper = new QueryWrapper<>();
//		queryWrapper.eq("PDF_uuid", pdfUuid.toString());
//		List<PdfimageExtract> all_url = pdfimageExtractMapper.selectList(queryWrapper);
//		Map<String, Object> result = new HashMap<>();
//		result.put("finish", false);
//		//	TODO: 判断图像字段+ 其他字段（暂时没有做）
//		if (all_url == null) {
//			//	为空表示正在解析,直接可以返回
//			return result;
//		}
//		// 真正解析完成
//		result.put("finish", true);
//		List<String> imageurl_list = new ArrayList<String>();
//		List<String> formaturl_list = new ArrayList<String>();
//		List<String> tableurl_list = new ArrayList<String>();
//		//进行结果的输出
//		for (int m = 0; m < all_url.size(); m++) {
//			PdfimageExtract record = all_url.get(m);
//			String urlTemp = record.getImageUrl();
//			if (urlTemp.contains("images")) {
//				imageurl_list.add(urlTemp);
//			} else if (urlTemp.contains("tables")) {
//				tableurl_list.add(urlTemp);
//			} else {
//				formaturl_list.add(urlTemp);
//			}
//		}
//		//结果字典的格式定义
//		result.put("images", imageurl_list);
//		result.put("tables", tableurl_list);
//		result.put("formulas", formaturl_list);
//		return result;//返回一个字典，键值分别是images，tables，formula
//
//	}
//
//	// 检查 pdfUuid 是否存在
//	private boolean isExistPdfUuid(Long pdfUuid) {
//		PdfExtract pdfExtract = this.getById(pdfUuid);
//		return pdfExtract != null;
//	}
//
//	/**
//	 * 描述: 异步调用图像解析微服务
//	 */
//	//@Async("asyncTaskExecutor")
//	@Override
//	public void imageExtract(Long pdfUuid, String pdfUrl) throws IOException {
//		String baseURL = "http://10.112.203.120:8820";
//		String api = "/extract_element_YOLO";
//		String url = baseURL + api;
//		//	根据pdf_url读取文件
//		URL realUrl = new URL(pdfUrl);
//		// 根据url解析文件名字
//		String temp[] = realUrl.toString().split("/");
//		String fileName = temp[temp.length - 1];
//		URLConnection conn = realUrl.openConnection();
//		InputStream inputStream = conn.getInputStream();
//		byte[] pdf_file = httpUtil.getFile(pdfUrl);
//		//	调用微服务
//		MultipartFile multipartFile = new MockMultipartFile("test.pdf",
//		 null, "multipart/form-data", pdf_file);
//		byte[] zip_byte = null;
//		try{
//			zip_byte = httpUtil.postFile(url, multipartFile);
//		}
//		catch(Exception e ){
//			this.removeById(pdfUuid);
//			throw  new MyExceptionHandler("YOLO报错");
//		}
//		if (zip_byte == null) {
//			throw new MyExceptionHandler("无法接收到文件");
//		}
//		File zip_file = new File("./image_file.zip");
//		FileOutputStream fos = new FileOutputStream(zip_file);
//		BufferedOutputStream bos = new BufferedOutputStream(fos);
//		bos.write(zip_byte);
//		List<InputStream> image_list = new ArrayList<InputStream>();
//		List<InputStream> format_list = new ArrayList<InputStream>();
//		List<InputStream> table_list = new ArrayList<InputStream>();
//		try {
//			ZipFile zipFile = new ZipFile(zip_file, Charset.forName("UTF-8"));
//			Enumeration<? extends ZipEntry> dirEntries = zipFile.entries();
//			while (dirEntries.hasMoreElements()) {
//				// 获取节点输入流
//				// 获取节点元数据
//				ZipEntry entry = dirEntries.nextElement();
//				String Filename = entry.getName();
//				InputStream inputStream3 = zipFile.getInputStream(entry);
//				if (Filename.contains("formula")) {
//					format_list.add(inputStream3);
//				} else if (Filename.contains("images")) {
//					image_list.add(inputStream3);
//				} else {
//					table_list.add(inputStream3);
//				}
//			}
//			List<String> imageurl_list = new ArrayList<String>();
//			List<String> formaturl_list = new ArrayList<String>();
//			List<String> tableurl_list = new ArrayList<String>();
//			//将每个image流转换为url并存入数据库
//			for (int i = 0; i < image_list.size(); i++) {
//				//放入静态数据库中
//				InputStream image_stream = image_list.get(i);
//
//				String image_url = fileService.uploadFile(image_stream,
//				 fileName.replace(".pdf", ""),
//				 "images" + i + ".png");
//				//写入表中
//				imageurl_list.add(image_url);
//				PdfimageExtract extractImage = new PdfimageExtract();
//				extractImage.setPdfUuid(pdfUuid);
//				extractImage.setImageUrl(image_url);
//				if (pdfimageExtractMapper.insert(extractImage) == 0) {
//					log.error("数据库插入失败");
//				}
//			}
//			//将每个table流转换为url并存入数据库
//			for (int j = 0; j < table_list.size(); j++) {
//				//放入静态数据库中
//				InputStream image_stream = table_list.get(j);
//				String image_url = fileService.uploadFile(image_stream,
//				 fileName.replace(".pdf", ""),
//				 "tables" + j + ".png");
//				//写入表中
//				tableurl_list.add(image_url);
//				PdfimageExtract extractImage = new PdfimageExtract();
//				extractImage.setPdfUuid(pdfUuid);
//				extractImage.setImageUrl(image_url);
//				if (pdfimageExtractMapper.insert(extractImage) == 0) {
//					log.error("数据库插入失败");
//				}
//			}
//			//将每个formula流转换为url并存入数据库
//			for (int k = 0; k < format_list.size(); k++) {
//				//放入静态数据库中
//				InputStream image_stream = format_list.get(k);
//				String image_url = fileService.uploadFile(image_stream,
//				 fileName.replace(".pdf", ""),
//				 "/formulas" + k + ".png");
//				//写入表中
//				formaturl_list.add(image_url);
//				PdfimageExtract extractImage = new PdfimageExtract();
//				extractImage.setPdfUuid(pdfUuid);
//				extractImage.setImageUrl(image_url);
//				if (pdfimageExtractMapper.insert(extractImage) == 0) {
//					log.error("数据库插入失败");
//				}
//			}
//		} catch (Exception e) {
//			log.error("MultipartFile转换为File转换异常：" + e.getMessage());
//		}
//	}
//
//	@Override
//	public void formulaExtract(Long pdfUuid) {
//	}
//
//	@Override
//	public void tableExtract(Long pdfUuid) {
//	}
//}
//
//
//
//
